package pos.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import pos.domain.Evento;
import pos.domain.Punto;
import pos.utils.UIDGenerator;

public class JDBCEventoDAO implements IEventoDAO {

	private IUsuarioDAO udao;
	private IPuntoDAO ip;

	public JDBCEventoDAO() {
		udao = new JDBCUsuarioDAO();
		ip = new JDBCPuntoDAO();
	}

	private void asociaPuntoAEvento(Connection conn, Punto p, String OID) {
		PreparedStatement stmt2 = null;
		PreparedStatement stmt4 = null;
		String sql2 = "INSERT INTO puntoevento(idPunto,IdEvento) VALUES(?,?)";
		String sql4 = "UPDATE puntos SET icono = ? WHERE OID = ?";
		String urlIcono = "http://google-maps-icons.googlecode.com/files/family.png";
		try {

			stmt2 = conn.prepareStatement(sql2);
			stmt4 = conn.prepareStatement(sql4);

			String idPuntos = ip.selectIdPuntoByPunto(conn, p);
			stmt2.setString(1, idPuntos);
			stmt2.setString(2, OID);

			stmt2.executeUpdate();
			System.out.println("Punto asociado al evento: " + p.getNombre());

			stmt4.setString(1, urlIcono);
			stmt4.setString(2, idPuntos);

			stmt4.executeUpdate();
			System.out.println("Icono cambiado a: " + p.getNombre());
		} catch (SQLException e) {
			System.out.println("Error en JDBCEventoDAO asociaPuntoAEvento");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt2 != null) {
					stmt2.close();
				}
				if (stmt4 != null) {
					stmt4.close();
				}
			} catch (SQLException e) {
			}
		}
	}

	private void updateNovedadesUsuario(Connection conn, String idEvento,
			List<Punto> puntos, String fechaFin, String titulo, String contenido,String fechaInicio) {
		PreparedStatement stmt3 = null;
		Set<String> insertados = new TreeSet<String>();
		String sql3 = "INSERT INTO novedades (idUsuario, idEvento,fecha_fin) VALUES (?,?,?)";
		try {
			stmt3 = conn.prepareStatement(sql3);

			for (Punto p : puntos) {
				List<String> afines = udao.selectUsuariosAfinesAPunto(conn,p);

				if (!afines.isEmpty()) {
					for (String oidUsuario : afines) {
						if (!insertados.contains(oidUsuario)) {
						
							/*//Quito que se envie el correo por que no funciona en los ordenadores, 
							 //	pero funciona correctamente
							String texto = "Buenas tardes! \n " +
									"bXip le informa de una nueva novedad\n" +
									"Desde el d�a: "+fechaInicio+" hasta: "+fechaFin+" \n" +
									"Tenemos esta oferta que puede interesarle: "+contenido+"\n" +
									"\n Un saludo!";
							String correo = udao.selectUsuarioByOID(conn, oid).getEmail();
							
							if(correo!=""){
							System.out.println("Se va a enviar a: "+correo);
							SimpleSSLMail sl = new SimpleSSLMail(correo, texto,"Novedades en bXip: "+titulo);
														sl.test();
							System.out.println("Correo enviado a la direccion: "+correo);
							}else{
								System.out.println("Correo vacio");
							}
							*/
							stmt3.setString(1, oidUsuario);
							stmt3.setString(2, idEvento);
							stmt3.setString(3, fechaFin);

							stmt3.executeUpdate();
							System.out.println("Actualizado usuario con ID: "
									+ oidUsuario);
						}
						insertados.add(oidUsuario);
					}
				}

			}

		} catch (SQLException e) {
			System.out.println("Error en JDBCEventoDAO updateNovedadesUsuario");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt3 != null) {
					stmt3.close();
				}
			} catch (SQLException e) {
			}
		}
	}

	public void insertEvento(Evento ev) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");
		PreparedStatement stmt = null;
		String sql = "INSERT INTO eventos ( OID , descripcion, titulo, fechaInicio, fechaFin, fechaPublicacion, idUsuario) VALUES (?, ?, ?, ?, ?, ?, ?) ";
		
		try {
			stmt = conn.prepareStatement(sql);
			String OID = UIDGenerator.getInstance().getKey();
			String fechaFin = ev.getFechaFin();
			String titulo =  ev.getTitulo();
			String descripcion = ev.getDescripcion();
			String fechaInicio = ev.getFechaInicio();
			String idUsuario = udao.selectOIDUsuarioByName(conn, ev
					.getAdministrador().getNombre());
			stmt.setString(1, OID);
			stmt.setString(2, descripcion);
			stmt.setString(3,titulo);
			stmt.setString(4,fechaInicio );
			stmt.setString(5, fechaFin);
			stmt.setString(6, ev.getFechaPublicacion());
			stmt.setString(7, idUsuario);

			stmt.executeUpdate();
			System.out.println("Evento creado con �xito: " + ev.getTitulo());
			List<Punto> puntos = ev.getPuntos();

			for (Punto p : puntos) {
				asociaPuntoAEvento(conn, p, OID);
			}
			updateNovedadesUsuario(conn, OID,  puntos, fechaFin,titulo,descripcion,fechaInicio);

		} catch (SQLException e) {
			System.out.println("Error en JDBCEventoDAO insertEvento");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Se ha cerrado la conexi�n correctamente");
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
	}

	
	public List<Evento> selectNovedades(String nick) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");

		String sql = "SELECT e.titulo,e.descripcion,e.fechaInicio,e.fechaFin,e.fechaPublicacion " +
				"FROM novedades n, eventos e WHERE (n.idUsuario = ? ) AND e.OID = n.idEvento ORDER BY e.fechaFin DESC";
		PreparedStatement stmt = null;
		ResultSet result = null;
		List<Evento> novedades = new LinkedList<Evento>();
		
		try {
			stmt = conn.prepareStatement(sql);

			String oid = (new JDBCUsuarioDAO()).selectOIDUsuarioByName(conn,
					nick);
			if (oid != null || oid != "") {
				stmt.setString(1, oid);
				result = stmt.executeQuery();
				while (result.next()) {
					Evento temp = new Evento();
					temp.setTitulo(result.getString("titulo"));
					temp.setDescripcion(result.getString("descripcion"));
					temp.setFechaInicio(result.getString("fechaInicio"));
					temp.setFechaFin(result.getString("fechaFin"));
					temp.setFechaPublicacion(result
							.getString("fechaPublicacion"));

					novedades.add(temp);
				}
			}
		} catch (SQLException e) {
			System.out.println("Error en JDBCEventoDAO selectNovedades");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Se ha cerrado la conexion correctamente");
			
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return novedades;

	}

}
